package com.pt.restaurant_backend_management.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pt.restaurant_backend_management.common.CustomException;
import com.pt.restaurant_backend_management.common.R;
import com.pt.restaurant_backend_management.mapper.SetmealMapper;
import com.pt.restaurant_backend_management.pojo.po.Category;
import com.pt.restaurant_backend_management.pojo.po.Dish;
import com.pt.restaurant_backend_management.pojo.po.Setmeal;
import com.pt.restaurant_backend_management.mapper.CategoryMapper;
import com.pt.restaurant_backend_management.mapper.DishMapper;
import com.pt.restaurant_backend_management.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

/**
 * 分类管理业务实现类
 * 提供分类新增、分页查询、删除、更新及条件查询等核心功能
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    @Autowired
    private DishMapper dishMapper;

    @Autowired
    private SetmealMapper setmealMapper;

    /**
     * 新增菜品分类信息
     * @param category 分类数据封装对象（包含分类名称、类型、排序等）
     * @return 返回通用响应对象，code=1表示成功，包含操作结果信息
     */
    @Override
    public R<String> saveSortInfo(Category category) {
        categoryMapper.insert(category);
        return R.success("新增分类成功！");
    }

    /**
     * 根据ID删除分类，删除前判断是否关联了菜品或套餐
     * @param id 需要删除的分类ID
     * @return 返回通用响应对象，包含操作结果信息
     * @throws CustomException 如果当前分类下存在关联的菜品或套餐，则抛出异常阻止删除
     */
    @Override
    public R<String> deleteSortInfo(Long id) {
        // 查询当前分类下是否存在菜品
        LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();//LambdaQueryWrapper<Dish> 是 MyBatis Plus 提供的查询构造器，用于构建 SQL 查询条件。
        dishLambdaQueryWrapper.eq(Dish::getCategoryId, id);//dishLambdaQueryWrapper.eq(Dish::getCategoryId, id) 表示查询 dish 表中 category_id = #{id} 的记录。
        Long count1 = dishMapper.selectCount(dishLambdaQueryWrapper);//dishMapper.selectCount(...) 统计符合条件的数据数量。

        if (count1 > 0) {
            throw new CustomException("当前分类下关联了菜品，不能删除！");
        }

        // 查询当前分类下是否存在套餐
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId, id);
        Long count2 = setmealMapper.selectCount(setmealLambdaQueryWrapper);

        if (count2 > 0) {
            throw new CustomException("当前分类下关联了套餐，不能删除！");
        }

        // 删除分类
        super.removeById(id);
        return R.success("分类信息删除成功！");
    }

    /**
     * 更新分类信息
     * @param category 包含更新内容的分类对象（需包含id字段）
     * @return 返回通用响应对象，包含操作结果信息
     */
    @Override
    public R<String> updateSortInfo(Category category) {
        categoryMapper.updateById(category);
        return R.success("修改完成！");
    }

    /**
     * 分页查询分类信息并按排序字段升序排列
     * @param page 当前页码
     * @param pageSize 每页显示数量
     * @return 返回包含分类分页数据的通用响应对象
     */
    @Override
    public R<Page> pageSortInfo(int page, int pageSize) {
        Page<Category> pageInfo = new Page<>(page, pageSize);
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByAsc(Category::getSort); // 按照排序字段升序排列
        categoryMapper.selectPage(pageInfo, queryWrapper);
        return R.success(pageInfo);
    }

    /**
     * 根据条件查询分类列表，并按指定字段排序
     * @param category 查询条件封装对象，可能包含type字段用于筛选分类类型
     * @return 返回包含分类列表的通用响应对象
     */
    @Override
    public R<List<Category>> getListInfo(Category category) {
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
        // 添加等值查询条件：如果 type 不为 null，则按 type 字段筛选分类
        queryWrapper.eq(category.getType() != null, Category::getType, category.getType());
        queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
        // 执行查询，获取符合条件的分类列表
        List<Category> categories = categoryMapper.selectList(queryWrapper);
        return R.success(categories);
    }
}
